package Repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import ClassesBasicas.Arbitro;
import Conexao.GConexao;
import Conexao.IConexao;
import erro.ConexaoException;
import erro.RepositorioException;



/**
 * camada de acesso a dados (DAO) referente a classe Arbitro
 * 
 * @author Prii :)
 *
 */

public class RepArbitro implements IRepArbitro{
	
	/* representa o GConexao */
	
	private IConexao conexao;
	
	public RepArbitro (){
		conexao = GConexao.getInstancia();
	}

/**
 * insere um Arbitro no Bando de Dados pelo nome
 * @throws ConexaoException , RepositorioException
 * @param Arbitro
 */

    
    @Override
    public void salvar(Arbitro arb) throws ConexaoException, RepositorioException {
            Connection c = conexao.conectar();
            
            String sqlSalvarArb = "INSERT INTO Arbitro(nome_Arbitro, Pais_Cod_Pais) values(?,?)";
            try{
                    PreparedStatement pstm = (PreparedStatement) c.prepareStatement(sqlSalvarArb);
                    pstm.setString(1, arb.getNomeArbitro());
                    pstm.setInt(2, arb.getCodPais());
                    pstm.executeUpdate();
                    pstm.close();
            }
            catch(SQLException e){
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
    }
    
    /**
     * Consulta um Arbitro pelo c�digo
     * @throws ConexaoException,RepositorioException
     * @return Arbitro
     */
    
    @Override
    public Arbitro consultarCod(int codArbitro) throws ConexaoException,RepositorioException {
            Arbitro arb = null;
            
            Connection c = (Connection) conexao.conectar();
            
            String sqlConsultArbById = "SELECT cod_Arbitro,nome_Arbitro,Pais_cod_pais FROM Arbitro WHERE cod_Arbitro = ? ";
            
            try {
                    PreparedStatement pstm = (PreparedStatement) c.prepareStatement(sqlConsultArbById);
                    pstm.setInt(1,codArbitro);
                    ResultSet result = pstm.executeQuery();
                    
                    if(result.next()){
                            arb = new Arbitro();
                            arb.setCodArbitro(result.getInt("cod_Arbitro"));
                            arb.setNomeArbitro(result.getString("nome_Arbitro"));
                            arb.setCodPais(result.getInt("Pais_cod_Pais"));
                           
                    } 
                    
            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
            
            return arb;
    }

    /**
     * Consulta um Arbitro pelo nome
     * @throws ConexaoException,RepositorioException
     * @return Arbitro
     * 
     */
    
    @Override
    public Arbitro consultarNome(String nomeArbitro) throws ConexaoException,RepositorioException {
            Arbitro arb = null;
            
            Connection c = conexao.conectar();
            
            String sqlConsultArbById = "SELECT cod_Arbitro,nome_Arbitro,Pais_cod_pais FROM Arbitro WHERE nome_Arbitro = ? ";
            
            try {
                    PreparedStatement pstm = c.prepareStatement(sqlConsultArbById);
                    pstm.setString(1,nomeArbitro);
                    ResultSet resut = pstm.executeQuery();
                	
					if(resut.next()){
                    	arb = new Arbitro();
                    	arb.setCodArbitro(resut.getInt("cod_Arbitro"));
                    	arb.setNomeArbitro(resut.getString("nome_Arbitro"));
                    	arb.setCodPais(resut.getInt("Pais_cod_Pais"));
                    }
                    
            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
            
            return arb;
    }
    
    /**
     * Exclui um Arbitro pelo seu c�digo
     * @param int
     * @return void
     * @throws ConexaoException,RepositorioException
     */
    
    @Override
    public void excluirCod(int codArbitro) throws ConexaoException,RepositorioException  {
            
            Connection c = (Connection) conexao.conectar();
            
            String sqlExcluirArb = "DELETE FROM Arbitro WHERE(cod_Arbitro = ?)";
            
            try {
                    PreparedStatement pstm = (PreparedStatement) c.prepareStatement(sqlExcluirArb);
                    pstm.setInt(1, codArbitro);
                    pstm.executeUpdate();
                    pstm.close();
                    
            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }

    }
    
    
    /**
     * Exclui um Arbitro pelo nome
     * @param String
     * @return void
     * @throws ConexaoException,RepositorioException
     */
    
    public void excluirNome(String nomeArbitro) throws ConexaoException,RepositorioException{
            
            Connection c = (Connection) conexao.conectar();
            
            String sqlExcluirArb = "DELETE FROM Arbitro WHERE(nome_Arbitro = ?)";
            
            try {
                    PreparedStatement pstm = (PreparedStatement) c.prepareStatement(sqlExcluirArb);
                    pstm.setString(1, nomeArbitro);
                    pstm.executeUpdate();
                    pstm.close();
            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
    }
    
    /**
     * Lista todos os Arbitros
     * @return Collection<Arbitro>
     * @throws ConexaoException,RepositorioException
     */
    
    @Override
    public Collection<Arbitro> listar() throws ConexaoException,RepositorioException {
            Arbitro arb = null; 
            ArrayList<Arbitro> lista = new ArrayList<Arbitro>();
            
            Connection c = conexao.conectar();
            
            String sqlListaArb = "SELECT cod_Arbitro, nome_Arbitro, Pais_Cod_Pais FROM Arbitro";
            
            try {
                    
		PreparedStatement pstm =  (PreparedStatement) c.prepareStatement(sqlListaArb);
                    ResultSet resut = pstm.executeQuery();
                    
                    while(resut.next()){
                    	
                    	arb = new Arbitro();
                    	arb.setCodArbitro(resut.getInt(1));
                    	arb.setNomeArbitro(resut.getString(2));
                    	arb.setCodPais(resut.getInt(3));
                    	
						lista.add(arb);
                    }
            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
            return lista;
    }
}

